#pragma once

#include "app_message.h"
#include "app_buffer.h"

// 设备类型枚举
typedef enum
{
    DEVICE_TYPE_NONE,
    DEVICE_TYPE_SERIAL,
    DEVICE_TYPE_CAN,
} DeviceType;

// 设备结构体
typedef struct
{
    DeviceType dev_type;                                     // 设备类型
    ConnectionType conn_type;                                // 连接类型
    char *dev_filename;                                      // 设备文件名
    int fd;                                                  // 设备文件描述符
    Buffer *up_buffer;                                       // 上行缓冲区
    Buffer *down_buffer;                                     // 下行缓冲区
    int (*post_read)(char *read_data, int read_data_size);   // 读取数据回调，读后预处理
    int (*pre_write)(char *write_data, int write_data_size); // 写入数据回调，写前预处理
    pthread_t read_thread;                                    // 读取芯片数据线程
    int is_running;                                          // 运行状态
    long last_write_ts_ms;                                   // 上次写时间戳
    long interval_ms;                                        // 发送间隔(默认100ms)
} Device;

// 初始化设备结构体
Device *app_device_init(char *dev_filename);

// 启动设备运行，开始读取芯片数据的线程，执行（从芯片中读取数据，到上行缓冲区）
int app_device_start(Device *dev);

// 从芯片中读取数据，到上行缓冲区（异步）
void *app_device_read(void *arg);

// 从上行缓冲区中读取数据到消息队列(交给线程池执行，异步方法)
void *app_device_send_to_mqtt(void *arg);

// 接收路由模块消息后，传递给设备模块
int app_device_recv_from_mqtt(Device *dev, Message *msg);

// 从设备模块的下行缓冲区写入芯片中（异步 由线程池执行）
void *app_device_write(void *dev);

// 销毁设备结构体
void app_device_destroy(Device *dev);
